//@ts-nocheck
import {ELEMENT_TEXT} from './constants';
import {Update} from './UpdateQueue'
import {scheduleRoot,useReducer,useState} from './schedule';

/**
 *
 * @param {} type
 * @param {*} config
 * @param {...any} children 放着所有的儿子
 */
function createElement(type, config, ...children){
  // delete config.__self;
  // delete config.__source; // 表示这个元素是在哪行哪咧哪个文件生成的

  return {
    type,
    props:{
      ...config,
      children: children.map(child => {
        return typeof child === 'object' ? child : {
          type: ELEMENT_TEXT,
          props: {text: child, children: []}
        }/**←emmm react源码中是直接返回的文本内容 而不是我们这样一个对象 我们这样做是为了简化 统一处理*/;
      })
    }
  }
}

class Component {
  constructor(props) {
    this.props = props;
  }

  setState(payload){ //可能是对象 也可能是一个函数
    const update = new Update(payload);
    this.internalFiber/**←在 schedule里的updateClassComponent方法里绑定的*/.updateQueue.enqueueUpdate(update);
    scheduleRoot()
  }
}

Component.prototype.isReactComponent = {}; // ←说明是一个类组件

const React = {
  createElement,
  Component,
  useReducer,
  useState
};

export default React;
